// Copyright (c) 2023 CHANGLEI. All rights reserved.

import 'package:flutter/rendering.dart';

/// Created by box on 2020/8/22.
///
/// 这个控件用在[AnimatedOffset]和[AnimatedBoundary]控件上用来界定他们的边界，以获取到准确的位置，
/// 不加这个控件的话，在滚动布局上，在滚动的适合，会有闪屏，出现这个问题的原因是他们在屏幕中的位置一直在变化
class RenderAnimatedShiftedBoxBoundary extends RenderRepaintBoundary implements RenderShiftedBoxBoundary {
  /// 初始化
  RenderAnimatedShiftedBoxBoundary({super.child});

  @override
  Matrix4 childTransform(RenderObject child) {
    return child.getTransformTo(this);
  }
}

/// Created by box on 2020/8/22.
///
/// 这个控件用在[AnimatedOffset]和[AnimatedBoundary]控件上用来界定他们的边界，以获取到准确的位置，
/// 不加这个控件的话，在滚动布局上，在滚动的适合，会有闪屏，出现这个问题的原因是他们在屏幕中的位置一直在变化
class RenderSliverAnimatedShiftedBoxBoundary extends RenderProxySliver implements RenderShiftedBoxBoundary {
  /// 初始化
  RenderSliverAnimatedShiftedBoxBoundary([super.child]);

  @override
  bool get isRepaintBoundary => true;

  @override
  Matrix4 childTransform(RenderObject child) {
    return child.getTransformTo(this)..translateByDouble(0, constraints.scrollOffset, 0, 1);
  }
}

/// 这个控件用在[AnimatedOffset]和[AnimatedBoundary]控件上用来界定他们的边界，以获取到准确的位置，
/// 不加这个控件的话，在滚动布局上，在滚动的适合，会有闪屏，出现这个问题的原因是他们在屏幕中的位置一直在变化
sealed class RenderShiftedBoxBoundary extends RenderObject {
  /// 获取[child]的位置
  Matrix4 childTransform(RenderObject child);
}
